// #include <memory>

#include "./EventLoopThreadPool.h"
// #include "./EventLoopThread.h"
// #include "../common/Logger.h"

EventLoopThreadPool::EventLoopThreadPool(EventLoop *mainLoop, const std::string &name)
    : mainLoop_(mainLoop), name_(name),
      isStart_(false), threadNum_(0), loopIndex_(0) // hash_(3)
{
}

std::string EventLoopThreadPool::getName() const
{
    return this->name_;
}

bool EventLoopThreadPool::getIsStart() const
{
    return this->isStart_;
}

std::vector<EventLoop *> EventLoopThreadPool::getLoops() const
{
    if (this->loops_.empty()) // 没有创建过线程，只有mainLoop
    {
        return std::vector<EventLoop *>(1, this->mainLoop_);
    }
    else
    {
        return this->loops_;
    }
}

void EventLoopThreadPool::setThreadNum(const size_t threadNum)
{
    this->threadNum_ = threadNum;
}

void EventLoopThreadPool::start(const ThreadInitCallback &cb)
{
    this->isStart_ = true;

    for (int i = 0; i < this->threadNum_; ++i)
    {
        char buf[this->name_.size() + 32];
        snprintf(buf, sizeof(buf), "%s%d", name_.c_str(), i);

        // TODO:new->make_unique<>
        // std::unique_ptr<EventLoopThread> et = std::make_unique<EventLoopThread>(cb, buf);    // 报错没有make_unique
        EventLoopThread *et = new EventLoopThread(cb, buf);

        // OPTIMIZE:push_back()->emplace_back()
        this->threads_.emplace_back(std::unique_ptr<EventLoopThread>(et));
        this->loops_.emplace_back(et->startLoop()); // 底层创建线程和loop，返回loop地址
        // hash_.addNode(buf);  // 将线程添加到一致哈希中。
    }

    if (this->threadNum_ == 0 && cb) // 只有一个线程运行mainLoop
    {
        cb(this->mainLoop_);
    }
}

EventLoop *EventLoopThreadPool::getNextLoop()
{
    EventLoop *nextLoop{this->mainLoop_};

    if (!this->loops_.empty())
    {
        // 先选再++
        nextLoop = this->loops_[this->loopIndex_];

        ++this->loopIndex_;
        if (this->loopIndex_ >= this->loops_.size())
        {
            this->loopIndex_ = 0;
        }
    }
    // 没有创建过线程，就是mainloop

    return nextLoop;
}

// EventLoop *EventLoopThreadPool::getNextLoop(const std::string &key)
// {
//     size_t index = hash_.getNode(key); // 获取索引
//     if (index >= loops_.size())
//     {
//         // 处理错误，例如返回 mainLoop 或抛出异常
//         LOG_ERROR("EventLoopThreadPool::getNextLoop ERROR");
//         return mainLoop_; // 或者返回 nullptr
//     }
//     return loops_[index]; // 使用索引访问 loops_
// }